package cn.wolfcode.shop.web.controller;

import cn.wolfcode.shop.domain.User;
import cn.wolfcode.shop.redis.RedisServer;
import cn.wolfcode.shop.redis.SeckillGoodKeyPrefix;
import cn.wolfcode.shop.result.CodeMsg;
import cn.wolfcode.shop.service.IGoodService;
import cn.wolfcode.shop.service.ISeckillGoodService;
import cn.wolfcode.shop.vo.GoodVo;
import cn.wolfcode.shop.web.result.Result;
import com.alibaba.dubbo.config.annotation.Reference;
import freemarker.template.Configuration;
import freemarker.template.Template;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import java.io.IOException;
import java.io.StringWriter;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Controller
@RequestMapping("/goods")
public class SeckillGoodController {
    @Reference
    private ISeckillGoodService seckillGoodService;
    @Reference
    private IGoodService goodService;
    @Autowired
    private RedisServer redisServer;
    @Autowired
    private Configuration configuration;
    /** 未使用缓存  QPS   940/s
     * 使用缓存     QPS   4500/s
     * 获取所有秒杀商品的信息
     * @param model
     * @return
     */
    @RequestMapping(value = "/to_list",produces = "text/html")
    @ResponseBody
    public String seckillGoodList(Model model){
        String html = redisServer.get(SeckillGoodKeyPrefix.SECKILL_GOOD_LIS_PAGE,"",String.class);
        if(html != null){
            //如果缓存中有秒杀列表页面的HTML字符串内容 则直接返回
            return html;
        }
        //走到这里说明缓存中没有页面 或者缓存页面已过期
        //因为秒杀商品信息已经存到缓存中,直接从缓存中获取数据,并放到model共享作用域中
        model.addAttribute("goodList",seckillGoodService.getByCache());
        try {
            //代用方法,将model数据模型 和模板 合成视图页面
            html = getHtml("goods_list",model);
            //将页面放进缓存中
            redisServer.set(SeckillGoodKeyPrefix.SECKILL_GOOD_LIS_PAGE, "", html);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return html;
    }

    /**
     * 手动使用数据填充模板  并将填充后的页面以字符串的形式返回
     * @param viewName
     * @param object
     * @return
     * @throws Exception
     */
    private String getHtml(String viewName,Object object) throws Exception {
        Template template = configuration.getTemplate(viewName+".ftl");
        StringWriter stringWriter = new StringWriter();
        template.process(object,stringWriter);
        return stringWriter.toString();
    }
    @RequestMapping("/to_detail")
    @ResponseBody
    public Result<Map> good_detail(Long goodId,User user){
        //参数拦截器 会拦截User类型参数,在拦截器中我们做了处理 会从redis中获取到User对象 并返回注入到user参数中

        Map map =new HashMap<>();
        map.put("user",user);
        //根据商品id从缓存中获去商品信息
        GoodVo goodVo = seckillGoodService.getCacheByGoodId(goodId);
        if(goodVo==null){
            return Result.error(CodeMsg.ILLEAGE_OP);
        }
        map.put("good",goodVo);
        return Result.success(map);
    }
    /**用户每次访问,都应该延长重置用户登录信息和cookie的失效时间
     * 所以使用参数拦截器,当形参出现User类型参数,则进行拦截处理
     * 延迟处理,并将redis中的user注入到形参中
     * 获取某一秒杀商品的详细信息
     * @param model
     * @return
     */
   /* @RequestMapping("/to_detail")
    public String good_detail(Long goodId, Model model,User user){
        //参数拦截器 会拦截User类型参数,在拦截器中我们做了处理 会从redis中获取到User对象 并返回注入到user参数中
        model.addAttribute("user",user);
        model.addAttribute("good",seckillGoodService.get(goodId));
        return "goods_detail";
    }*/
}
